package com.renshine.base.util;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

import com.renshine.base.bean.Assemble;
import com.renshine.base.bean.User;

/**
 * 记录数据库的登录信息
 * 
 * @author deyang
 *
 */
public class Configuration {

	private static String FILE_PROPERTIES_PATH = "configuration.properties";
	private Properties prop;

	/** 加载配置文件 */
	public static Configuration load() {
		return new Configuration(FILE_PROPERTIES_PATH);
	}

	/**
	 * 初始化Configuration类
	 * 
	 * @param filePath
	 *            要读取的配置文件的路径+名称
	 */
	public Configuration(String filePath) {
		FileInputStream inputFile = null;
		prop = new Properties();
		try {
			inputFile = new FileInputStream(this.getClass().getClassLoader()
					.getResource(filePath).getPath());
			prop.load(inputFile);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (inputFile != null) {
					inputFile.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 取得key对应的值
	 * 
	 * @param key
	 * @return key的值
	 */
	public String getValue(String key) {
		if (prop.containsKey(key))
			return prop.getProperty(key);// 得到某一属性的值
		else
			return null;
	}

	/**
	 * 设置key的值
	 * 
	 * @param key
	 * @param value
	 */
	public void setValue(String key, String value) {
		prop.setProperty(key, value);
	}

	/**
	 * 将更改后的文件数据存入指定的文件中，该文件可以事先不存在。
	 * 
	 * @param fileName
	 *            文件路径+文件名称
	 * @param description
	 *            对该文件的描述
	 */
	public void save(String fileName, String description) {
		FileOutputStream outputFile = null;
		try {
			outputFile = new FileOutputStream(this.getClass().getClassLoader()
					.getResource(fileName).getPath());
			prop.store(outputFile, description);
			outputFile.close();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (outputFile != null) {
					outputFile.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 从配置文件中读取上一次用户登录的用户信息
	 * 
	 * @return 上一次用户登录的信息
	 */
	public static User getHasLoginUser() {
		Configuration fig = load();
		User user = new User();
		if (!fig.prop.isEmpty()) {
			user.setDialect(fig.getValue("db.dialect"));
			user.setUsername(fig.getValue("db.username"));
			user.setPassword(fig.getValue("db.password"));
			user.setJdbcUrl(fig.getValue("db.jdbcUrl"));
		}
		return user;
	}
	
	/**
	 * 取得代码的配置信息，如作者，模板等
	 * 
	 * @return
	 */
	public static Assemble getHasAssemble() {
		Configuration fig = load();
		Assemble assemble = new Assemble();
		if (!fig.prop.isEmpty()) {
			assemble.setAuthor(fig.getValue("ab.author"));
			assemble.setTemplate(fig.getValue("ab.template"));
			assemble.setModule(fig.getValue("ab.module"));
			assemble.setCodepath(fig.getValue("ab.codepath"));
		}
		return assemble;
	}

	/**
	 * 登录成功后将登录的用户信息保存到配置文件中
	 * 
	 * @param user
	 *            登录成功的用户信息
	 */
	public static void saveLoginUser(User user) {
		Configuration fig = load();
		fig.setValue("db.dialect", user.getDialect());
		fig.setValue("db.jdbcUrl", user.getJdbcUrl());
		fig.setValue("db.username", user.getUsername());
		fig.setValue("db.password", user.getPassword());
		fig.save(FILE_PROPERTIES_PATH, "last modified info");
	}

	/**
	 * 保存代码的配置信息
	 * 
	 * @param assemble
	 */
	public static void saveAssemble(Assemble assemble) {
		Configuration fig = load();
		fig.setValue("ab.author", assemble.getAuthor());
		fig.setValue("ab.template", assemble.getTemplate());
		fig.setValue("ab.module", assemble.getModule());
		fig.setValue("ab.codepath", assemble.getCodepath());
		fig.save(FILE_PROPERTIES_PATH, "last modified info");
	}

}
